package com.moyu.common.security.service;

import cn.hutool.core.lang.UUID;
import com.moyu.common.core.constants.CacheConstants;
import com.moyu.common.core.constants.JwtConstants;
import com.moyu.common.core.domain.LoginUser;
import com.moyu.common.core.domain.PermissionDTO;
import com.moyu.common.core.utils.JwtUtils;
import com.moyu.common.redis.service.RedisService;

import io.jsonwebtoken.Claims;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;

/**
 * 用户登录token
 *
 * @Author 赵彦博
 * @Date 2024/11/20 17:42
 */
@Component
@Slf4j
public class TokenService {

    @Autowired
    private RedisService redisService;


    public String createToken(Long userId, String secret, List<PermissionDTO> permissionDTOS) {
        // 生成JWT token
        Map<String, Object> claims = new HashMap<>();
        String userKey = UUID.fastUUID().toString();
        claims.put(JwtConstants.LOGIN_USER_ID, userId);
        claims.put(JwtConstants.LOGIN_USER_KEY, userKey);
        String token = JwtUtils.createToken(claims, secret);
        // 第三方机制中存储敏感信息 redis
        String tokenKey = getTokenKey(userKey);
        LoginUser loginUser = new LoginUser();
        loginUser.setId(userId);
        loginUser.setPermissionDTOS(permissionDTOS);
//        redisService.setCacheObject(tokenKey, loginUser, CacheConstants.EXPIRATION, TimeUnit.MINUTES);
        return token;
    }

    public void extendSaTokenInRedis(Long userId) {
        // 从Redis中获取令牌相关信息
        Map<String, Object> userTokenMap = redisService.getCacheObject(userId.toString(), Map.class);
        if (userTokenMap == null) {
            log.error("未找到用户ID为 {} 的令牌信息，无法延长有效期", userId);
            return;
        }
        Date createTime = (Date) userTokenMap.get("createTime");
        if (createTime == null) {
            log.error("令牌信息中缺少创建时间，无法延长有效期，用户ID: {}", userId);
            return;
        }
        // 获取当前时间
        Date currentTime = new Date();
        // 计算时间差，单位为毫秒
        long timeDiff = currentTime.getTime() - createTime.getTime();
        // 将时间差转换为秒
        long timeDiffSeconds = timeDiff / 1000;
        // 如果时间差小于刷新时间（这里假设刷新时间为半小时，可根据业务需求调整），则延长有效期
        if (timeDiffSeconds < CacheConstants.REFRESH_TIME) {
            // 更新Redis中的过期时间设置
            redisService.expire(userId.toString(), CacheConstants.EXPIRATION, TimeUnit.SECONDS);
            log.info("已成功延长用户ID为 {} 的Sa-Token有效期", userId);
        } else {
            log.info("用户ID为 {} 的Sa-Token有效期无需延长", userId);
        }
    }

    private String getTokenKey(String userKey) {
        return CacheConstants.LOGIN_TOKEN_KEY + userKey;
    }
}

